home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Scope
/
Scope Disk #060 (199x)(Scope PD)(US)[WB].zip
/
Scope Disk #060 (199x)(Scope PD)(US)[WB].adf
/
Wrap
/
wrap.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-11-06
|
8KB
|
339 lines
/* November 6th, 1988 */
/* I took the MachMouse source code and cut it down to just the parts */
/* which were needed for the pointer manipulation, So this source is */
/* actually already in the PD. Anyway, I just thought I'd include it */
/* because I HATE IT WHEN SOMEONE DOESN'T DISTRIBUTE THEIR SOURCE CODE */
/* WITH THEIR PROGRAM. drives me nuts. This is totally PD, ofcourse. */
/* Probably not perfectly written, and no documentation - sorry. */
/* Used Manx C v3.4b */
/* Enjoy, K.Mardam-Bey */
#include <devices/input.h>
#include <devices/inputevent.h>
#include <devices/timer.h>
#include <exec/types.h>
#include <exec/interrupts.h>
#include <exec/memory.h>
#include <exec/ports.h>
#include <functions.h>
#include <graphics/gfxmacros.h>
#include <intuition/intuitionbase.h>
#define QUIT 0x1
#define MOVEIT 0x4
#define DELAY 1000000L
#define LAMIGA 0x66
#define STOPIT 0x41
char PortName[] = "PPT";
short left, right;
short dx,dy;
short x,y;
short event;
short lastcode = 0;
long sec = 0,micro = 0;
short rbuttonisdown = 0, lbuttonisdown = 0;
struct MsgPort *inputPort = NULL;
struct IOStdReq *inputReq = NULL;
struct MsgPort *TimerPort = NULL;
struct Screen *s;
struct IntuitionBase *IntuitionBase = NULL;
struct timerequest Timer_Req;
long TimerSig,tdevice = 1;
struct InputEvent phoney;
struct HotInfo
{
struct Task *hotTask;
long hotSig;
} hotStuff;
long signum = -1;
struct Interrupt handlerStuff;
struct defPort
{
struct MsgPort mp;
};
struct defPort *defPortPtr;
char defPortName[] = "MaDP";
short updating = 0;
void HandlerInterface()
{
#asm
movem.l a4,-(sp)
jsr _geta4#
movem.l A0/A1,-(sp)
jsr _myhandler
addq.l #8,A7
movem.l (sp)+,a4
#endasm
}
struct InputEvent *myhandler(ev1, hotStuff)
struct InputEvent *ev1;
struct HotInfo *hotStuff;
{
struct InputEvent *ev, *last;
short removeit;
short evcode,evqual;
event = 0;
for (ev=ev1,last = NULL; ev; ev=ev->ie_NextEvent)
{
evcode = ev->ie_Code;
evqual = ev->ie_Qualifier;
removeit = 0;
if ((ev->ie_Class != IECLASS_TIMER))
{
if (ev->ie_Class == IECLASS_RAWKEY)
{
if ((evcode >= 0x80) && (evcode == (lastcode | 0x80))) {
removeit = 1;
lastcode = 0; }
else
if (evcode == LAMIGA) {
lastcode = evcode;
removeit = 1; }
else {
lastcode = 0;
removeit = 0;
}
if ((evcode == STOPIT)&&((evqual & IEQUALIFIER_LCOMMAND) == IEQUALIFIER_LCOMMAND))
{
lastcode = evcode;
removeit = 1;
event |= QUIT;
}
}
}
if (ev->ie_Class == IECLASS_RAWMOUSE)
{
if (!left && (evcode == IECODE_LBUTTON))
lbuttonisdown = 1;
if (!right && (evcode == IECODE_RBUTTON))
rbuttonisdown = 1;
s = IntuitionBase->FirstScreen;
while (s && (s->MouseY < 0)) s = s->NextScreen;
if (s == NULL) s = IntuitionBase->ActiveScreen;
x = s->MouseX + ev->ie_X;
y = s->MouseY + ev->ie_Y;
if ((ev->ie_TimeStamp.tv_secs == sec) && ((ev->ie_TimeStamp.tv_micro / 50000) == micro))
{
dx = ev->ie_X;
dy = ev->ie_Y;
if (!lbuttonisdown && !rbuttonisdown) event |= MOVEIT;
}
if (ev->ie_TimeStamp.tv_secs)
{
micro = ev->ie_TimeStamp.tv_micro / 50000;
sec = ev->ie_TimeStamp.tv_secs;
}
if (evcode == (IECODE_LBUTTON | 0x80))
lbuttonisdown = 0;
if (evcode == (IECODE_RBUTTON | 0x80))
rbuttonisdown = 0;
}
if (removeit)
if (last == NULL)
ev1 = ev->ie_NextEvent;
else
last->ie_NextEvent = ev->ie_NextEvent;
else
last = ev;
}
if (event)
Signal(hotStuff->hotTask,hotStuff->hotSig);
return(ev1);
}
main (argc, argv)
int argc;
char *argv[];
{
struct IntuiMessage *Msg;
long class;
long len;
short i,j,f,c;
IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library",0L);
defPortPtr = (struct defPort *) FindPort(defPortName);
if (defPortPtr == NULL)
{
if ((defPortPtr = (struct defPort *) AllocMem((long)sizeof(struct defPort),MEMF_PUBLIC | MEMF_CLEAR)) == NULL)
exit(10);
}
else
updating = 1;
if (updating)
Uninstall();
i = left = right = 0;
while (argv[1][i]) {
if (argv[1][i] == 'l')
left = 1;
if (argv[1][i] == 'r')
right = 1;
i += 1;
}
defPortPtr->mp.mp_Node.ln_Pri = 0;
defPortPtr->mp.mp_Node.ln_Type = NT_MSGPORT;
NewList(&(defPortPtr->mp.mp_MsgList));
defPortPtr->mp.mp_Node.ln_Name = (char *) &(defPortName);
AddPort(defPortPtr);
if((signum = AllocSignal((long)-1)) == -1)
Uninstall();
hotStuff.hotSig = 1 << signum;
hotStuff.hotTask = FindTask(NULL);
if(!(inputPort = CreatePort(PortName,0)))
Uninstall();
if(!(inputReq = CreateStdIO(inputPort)))
Uninstall();
handlerStuff.is_Data = (APTR)&hotStuff;
handlerStuff.is_Code = HandlerInterface;
handlerStuff.is_Node.ln_Pri = 55;
handlerStuff.is_Node.ln_Name = "PopHan";
if(OpenDevice("input.device",0L,inputReq,0L) != 0)
Uninstall();
inputReq->io_Command = IND_ADDHANDLER;
inputReq->io_Data = (APTR)&handlerStuff;
DoIO(inputReq);
if ((TimerPort = CreatePort("TimP", 0L)) == NULL)
Uninstall();
if ((tdevice = OpenDevice(TIMERNAME, UNIT_VBLANK, &Timer_Req, 0L)) != 0)
Uninstall();
Timer_Req.tr_node.io_Message.mn_ReplyPort = TimerPort;
Timer_Req.tr_node.io_Command = TR_ADDREQUEST;
Timer_Req.tr_node.io_Flags = 0;
Timer_Req.tr_node.io_Error = 0;
TimerSig = (1L << TimerPort->mp_SigBit);
(void)SetTaskPri(FindTask(NULL), 0L);
QueTimer();
for (;;)
{
Wait(hotStuff.hotSig | TimerSig);
if (Msg = (struct IntuiMessage *)GetMsg(TimerPort))
if (Msg) QueTimer();
if (event & MOVEIT)
MovePointer();
if (event & QUIT)
Uninstall();
}
}
QueTimer()
{
Timer_Req.tr_time.tv_secs = 0;
Timer_Req.tr_time.tv_micro = DELAY;
SendIO(&Timer_Req.tr_node);
}
MovePointer()
{
s = IntuitionBase->ActiveScreen;
x = s->MouseX;
y = s->MouseY;
if (x < 1)
dx = s->Width * 2;
if (x >= s->Width - 1)
dx = (s->Width * -2);
if (y < 1)
dy = s->Height * 3;
if (y >= s->Height - 1)
dy = (s->Height * -3);
inputReq->io_Command = IND_WRITEEVENT;
inputReq->io_Flags = 0;
inputReq->io_Length = sizeof(struct InputEvent);
inputReq->io_Data = (APTR)&phoney;
phoney.ie_NextEvent = NULL;
phoney.ie_Class = IECLASS_RAWMOUSE;
phoney.ie_TimeStamp.tv_secs = 0;
phoney.ie_TimeStamp.tv_micro = 0;
phoney.ie_Code = IECODE_NOBUTTON;
phoney.ie_Qualifier = IEQUALIFIER_RELATIVEMOUSE;
phoney.ie_X = dx;
phoney.ie_Y = dy;
DoIO(inputReq);
}
Uninstall()
{
if (!updating)
{
if (inputReq)
{
inputReq->io_Command = IND_REMHANDLER;
inputReq->io_Data = (APTR)&handlerStuff;
DoIO(inputReq);
CloseDevice(inputReq);
DeleteStdIO(inputReq);
}
if (inputPort) DeletePort(inputPort);
if (signum > -1) FreeSignal(signum);
if (tdevice == 0)
{
AbortIO(&Timer_Req.tr_node);
CloseDevice(&Timer_Req);
}
if (TimerPort)
DeletePort(TimerPort);
if (defPortPtr)
{
if (defPortPtr->mp.mp_Node.ln_Name)
RemPort(defPortPtr);
FreeMem(defPortPtr,(long)sizeof(struct defPort));
}
}
if (IntuitionBase)
CloseLibrary(IntuitionBase);
exit(0L);
}